<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深拷贝</title>
</head>

<body>
    <script>
        // 最优方法，可以实现大多引用类型的深拷贝
        // 基本实现常用类型的拷贝
        const deepClone = (target) => {
            let result
            if (typeof target === 'object') {
                if (Array.isArray(target)) {
                    result = []
                    for (let i in target) {
                        result.push(deepClone(target[i]))
                    }
                } else if (target === null) {
                    result = null
                } else {
                    result = {}
                    for (let i in target) {
                        result[i] = deepClone(target[i])
                    }
                }
            } else {
                result = target
            }
            return result
        }

        // #region
        // let obj = {
        //     a:1, b:2, c: {
        //         d: 2
        //     }
        // }
        // let obj2 = deepClone(obj)
        // obj2.b = 3
        // obj2.c.d = 5
        // console.log(obj);
        // console.log(obj2);

        // let arr = [1, 2, 3, 4, [5,6]]
        // arr2 = deepClone(arr)
        // arr2[0] = 5
        // arr2[4][0] = 7
        // console.log(arr);
        // console.log(arr2);

        // let a = 3
        // b = deepClone(a)
        // b = 4
        // console.log(a);
        // console.log(b);

        // let x = undefined
        // let y = deepClone(x)
        // y = 3
        // console.log(x);
        // console.log(y);

        // let x = function() {}
        // let y = deepClone(x)
        // console.log(x);
        // console.log(y);
        // #endregion

        const deepClone2 = (target) => {
            return JSON.parse(JSON.stringify(target))
        }

        // #region
        // let a = 1
        // let b =deepClone2(a)
        // // b = 3
        // console.log(a);
        // console.log(b);

        // let obj = {
        //     a:1, b:2, c: {
        //         d: 2
        //     }
        // }
        // let obj2 = deepClone2(obj)
        // obj2.b = 3
        // obj2.c.d = 5
        // console.log(obj);
        // console.log(obj2);

        // 拷贝undefined时会报错
        // let x = undefined
        // let y = deepClone2(x)
        // // y = 3
        // console.log(x);
        // console.log(y);

        // let arr = [1, 2, 3, 4, [5,6]]
        // arr2 = deepClone2(arr)
        // arr2[0] = 5
        // arr2[4][0] = 7
        // console.log(arr);
        // console.log(arr2);

        // let x = null
        // let y =deepClone2(x)
        // y = 2
        // console.log(x);
        // console.log(y);

        // 拷贝函数会报错
        // let x = function() {}
        // let y = deepClone2(x)
        // console.log(x);
        // console.log(y);
        // #endregion

        </script>
</body>

</html>